package com.zbkj.generate.utils;


import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;


/**
 * 代码生成器
 * @author XUETAO
 *
 */
public class CodeGeneratorV1 {

    // 表名
    static String[] tableNames = { "eb_user_dividend_record" };
//    static String url = "jdbc:mysql://110.41.191.33:3307/xt_mer_zfb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
    static String url = "jdbc:mysql://127.0.0.1:3306/xt_mer_zfb1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
    static String username = "root";
//    static String password = "Ab.Test2025";
    static String password = "123456";
    static String tablePrefix = "eb_";
    static String author = "Caiyc";
    // 模块
    static String modelName = "agent";
    static Boolean over = false;

    public static void main(String[] args) {
        crmebController();
        crmebEntity();
        crmebXmlAndMapper();
        crmebService();
        crmebRequest();
    }

    private static void crmebRequest() {
        // 数据库表名称
        grSearchRequest(true,"SearchRequest", "request", "请求对象", tableNames);
        grSearchRequest(true,"SaveRequest", "request", "请求对象", tableNames);
        grSearchRequest(true,"PageDataResponse", "response", "响应对象", tableNames);
        grSearchRequest(true,"DetailResponse", "response", "详情响应对象", tableNames);
    }

    private static void grSearchRequest(boolean isTablePrefix, String fileName, String type, String classDesc, String... tableNames) {
        if (type.equals("request")) {
            if (fileName.contains("Search")) {
                classDesc = "查询" + classDesc;
            }
            if (fileName.contains("Search")) {
                classDesc = "保存" + classDesc;
            }
        }
        if (type.equals("response")) {
            if (fileName.contains("Page")) {
                classDesc = "分页数据" + classDesc;
            }
        }
        for (int i = 0; i < tableNames.length; i++) {
            String tableName = tableNames[i];
            tableName = isTablePrefix ? tableName.substring(tableName.indexOf("_") + 1) : tableName;
            String suPkStr = StringUtils.remove(tableName, "_").toLowerCase();
            String outPutDir = System.getProperty("user.dir") + "/crmeb-common/src/main/java" + "/"
//                    + ("com.zbkj.common".replace(".", "/")) + "/request"
                    + ("com.zbkj.common".replace(".", "/")) + "/" + type
                    + "/";
            String baseFileName = StringUtil.underline2Camel(tableName, false);
            try {
                File outFile = new File(outPutDir);
                if (!outFile.exists()) {
                    outFile.mkdirs();
                }
                // 文件名
                File voFile = new File(outFile, baseFileName + fileName + ".java");
                if (!voFile.exists()) {
                    voFile.createNewFile();
                }
                BufferedReader reader = new BufferedReader(
                        new FileReader(System.getProperty("user.dir") + "/crmeb-common/src/main/java"
                                + "/" + ("com.zbkj.common".replace(".", "/"))
                                + "/model/" + modelName + "/" + baseFileName + ".java"));
//                                + suPkStr + "/" + baseFileName + "Entity.java"));
                FileWriter fw = new FileWriter(voFile);
                String line = null;
                String line1 = null;
                while ((line = reader.readLine()) != null) {
                    // 将实体类中的entity变为Vo
                    line = line.replace(baseFileName, baseFileName + fileName);//.replace("Entity", "Vo");
//                    line = line.replace("model", "vo");//.replace("Entity", "Vo");
                    // 去掉mybatis-plus注解
                    if (line.contains("TableName") || line.contains("TableField") || line.contains("Accessors")) {
                        continue;
                    }
                    if(line.startsWith("package")){
                        line = "package com.zbkj.common."+type+";";
                    }
                    if(type.equals("response")){
                        if(line.contains("@TableId")){
                            continue;
                        }
                    }else{
                        if(line.contains("@TableId") || line.contains("private Integer id;") || line.contains("@ApiModelProperty(value = \"主键ID\")")){
                            continue;
                        }
                    }

                    if(line.startsWith("@ApiModel")){
                        line1 = line;
                    }
                    line += "\r\n";
                    fw.write(line);
                }
                fw.close();
                reader.close();

                int i1 = line1.indexOf("description=");
                String tableDesc = line1.substring(i1 + 13, line1.length() - 2).trim();
                System.out.println("tableDesc = " + tableDesc);

                File voFile1 = new File(outFile, baseFileName + fileName + ".java");
                String s = FileUtil.readString(voFile1, "UTF-8");
                s = s.replace(tableDesc, tableDesc.replace("表","") + classDesc);
                FileUtil.writeString(s, voFile1, "UTF-8");

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    private static void crmebXmlAndMapper() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/crmeb-service/src/main/resources");
        gc.setAuthor(author);
        gc.setOpen(false);//当代码生成完成之后是否打开代码所在的文件夹
        gc.setSwagger2(true); //默认false
        gc.setServiceName("%sService");
        gc.setMapperName("%sDao");
        // 时间类型
        gc.setDateType(DateType.ONLY_DATE);
        gc.setFileOverride(over);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = getDataSourceConfig();
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName("order");
//        pc.setParent("com.zbkj.service");//controller entity  service  service.impl
        pc.setParent(null);//模块
        pc.setController("controller");
//        pc.setEntity("model.order"); // 实体类所在包
        pc.setEntity("model." + modelName); // 实体类所在包
        pc.setMapper("com.zbkj.service.dao");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setXml("mapper." + modelName); // 放到mapper文件夹下面
        mpg.setPackageInfo(pc);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        templateConfig.setController("templates/v1/controller.java.vm");
        templateConfig.setService("templates/v1/service.vm");
        templateConfig.setServiceImpl("templates/v1/service.impl.vm");

        templateConfig.setController(null); // 不生成
//        templateConfig.setXml("/mapper/" + "%s" + "Mapper.xml"); // 不生成xml文件
        templateConfig.setEntity(null); // 不生成
        templateConfig.setService(null); // 不生成
        templateConfig.setMapper(null); // 不生成
        templateConfig.setServiceImpl(null); // 不生成

        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //设置字段和表名的是否把下划线完成驼峰命名规则
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //设置生成的实体类继承的父类
//        strategy.setSuperEntityClass("com.sxt.BaseEntity");
        strategy.setEntityLombokModel(true);//是否启动lombok
        strategy.setRestControllerStyle(true);//是否生成resetController
        // 公共父类
//        strategy.setSuperControllerClass("com.sxt.BaseController");
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("create_time","update_time");
        //要设置生成哪些表 如果不设置就是生成所有的表
        strategy.setTablePrefix(tablePrefix); //生成的文件会名去掉表前缀
//        strategy.setInclude(scanner("表名，多个英文逗号分割").split(","));
        strategy.setInclude(tableNames);
        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");

        mpg.setStrategy(strategy);
        mpg.execute();
    }

    private static DataSourceConfig getDataSourceConfig() {
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(url);
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername(username);
        dsc.setPassword(password);
        return dsc;
    }

    private static void crmebEntity() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/crmeb-common/src/main/java");
        gc.setAuthor(author);
        gc.setOpen(false);//当代码生成完成之后是否打开代码所在的文件夹
        gc.setSwagger2(true); //默认false
        gc.setServiceName("%sService");
        gc.setMapperName("%sDao");
        // 时间类型
        gc.setDateType(DateType.ONLY_DATE);
        gc.setFileOverride(over);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = getDataSourceConfig();
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName("order");
        pc.setParent("com.zbkj.common");//controller entity  service  service.impl
        pc.setController("controller");
        pc.setEntity("model." + modelName); // 实体类所在包
        pc.setMapper("dao");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setXml("mapper");
        mpg.setPackageInfo(pc);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        templateConfig.setController("templates/v1/controller.java.vm");
        templateConfig.setService("templates/v1/service.vm");
        templateConfig.setServiceImpl("templates/v1/service.impl.vm");

        templateConfig.setController(null); // 不生成
        templateConfig.setXml(null); // 不生成xml文件
//        templateConfig.setEntity(null); // 不生成
        templateConfig.setService(null); // 不生成
        templateConfig.setMapper(null); // 不生成
        templateConfig.setServiceImpl(null); // 不生成

        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //设置字段和表名的是否把下划线完成驼峰命名规则
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //设置生成的实体类继承的父类
//        strategy.setSuperEntityClass("com.sxt.BaseEntity");
        strategy.setEntityLombokModel(true);//是否启动lombok
        strategy.setRestControllerStyle(true);//是否生成resetController
        // 公共父类
//        strategy.setSuperControllerClass("com.sxt.BaseController");
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("create_time","update_time");
        //要设置生成哪些表 如果不设置就是生成所有的表
        strategy.setTablePrefix(tablePrefix); //生成的文件会名去掉表前缀
//        strategy.setInclude(scanner("表名，多个英文逗号分割").split(","));
        strategy.setInclude(tableNames);
        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");

        mpg.setStrategy(strategy);
        mpg.execute();
    }

    private static void crmebService() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/crmeb-service/src/main/java");
        gc.setAuthor(author);
        gc.setOpen(false);//当代码生成完成之后是否打开代码所在的文件夹
        gc.setSwagger2(true); //默认false
        gc.setServiceName("%sService");
        gc.setMapperName("%sDao");
        // 时间类型
        gc.setDateType(DateType.ONLY_DATE);
        gc.setFileOverride(over);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = getDataSourceConfig();
        mpg.setDataSource(dsc);


        // 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName("order");
        pc.setParent(null);//controller entity  service  service.impl
        pc.setController("controller");
        pc.setEntity("com.zbkj.common.model." + modelName); // 实体类所在包
        pc.setMapper("com.zbkj.service.dao");
        pc.setService("com.zbkj.service.service");
        pc.setServiceImpl("com.zbkj.service.service.impl");
        pc.setXml("mapper");
        mpg.setPackageInfo(pc);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        templateConfig.setController("templates/v1/controller.java.vm");
        templateConfig.setService("templates/v1/service.vm");
        templateConfig.setServiceImpl("templates/v1/service.impl.vm");

        templateConfig.setController(null); // 不生成
        templateConfig.setXml(null); // 不生成xml文件
        templateConfig.setEntity(null); // 不生成
//        templateConfig.setService(null); // 不生成
//        templateConfig.setMapper(null); // 不生成
//        templateConfig.setServiceImpl(null); // 不生成

        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //设置字段和表名的是否把下划线完成驼峰命名规则
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //设置生成的实体类继承的父类
//        strategy.setSuperEntityClass("com.sxt.BaseEntity");
        strategy.setEntityLombokModel(true);//是否启动lombok
        strategy.setRestControllerStyle(true);//是否生成resetController
        // 公共父类
//        strategy.setSuperControllerClass("com.sxt.BaseController");
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("create_time","update_time");
        //要设置生成哪些表 如果不设置就是生成所有的表
        strategy.setTablePrefix(tablePrefix); //生成的文件会名去掉表前缀
//        strategy.setInclude(scanner("表名，多个英文逗号分割").split(","));
        strategy.setInclude(tableNames);
        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");

        mpg.setStrategy(strategy);
        mpg.execute();
    }

    private static void crmebController() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/crmeb-admin/src/main/java");
        gc.setAuthor(author);
        gc.setOpen(false);//当代码生成完成之后是否打开代码所在的文件夹
        gc.setSwagger2(true); //默认false
        gc.setServiceName("%sService");
        gc.setMapperName("%sDao");
        // 时间类型
        gc.setDateType(DateType.ONLY_DATE);
        gc.setFileOverride(over);

        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = getDataSourceConfig();
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName("aaa");
        pc.setParent(null);//controller entity  service  service.impl
        pc.setController("com.zbkj.admin.controller"); // 控制器的包名
        pc.setEntity("com.zbkj.common.model." + modelName);
        pc.setMapper("dao");
        pc.setService("com.zbkj.service.service");
        pc.setServiceImpl("service.impl");
        pc.setXml("mapper");
        mpg.setPackageInfo(pc);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        templateConfig.setController("templates/v1/controller.java.vm");
        templateConfig.setService("templates/v1/service.vm");
        templateConfig.setServiceImpl("templates/v1/service.impl.vm");

        templateConfig.setXml(null); // 不生成xml文件
        templateConfig.setEntity(null); // 不生成
        templateConfig.setService(null); // 不生成
        templateConfig.setMapper(null); // 不生成
        templateConfig.setServiceImpl(null); // 不生成

        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //设置字段和表名的是否把下划线完成驼峰命名规则
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //设置生成的实体类继承的父类
//        strategy.setSuperEntityClass("com.sxt.BaseEntity");
        strategy.setEntityLombokModel(true);//是否启动lombok
        strategy.setRestControllerStyle(true);//是否生成resetController
        // 公共父类
//        strategy.setSuperControllerClass("com.sxt.BaseController");
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("create_time","update_time");
        //要设置生成哪些表 如果不设置就是生成所有的表
        strategy.setTablePrefix(tablePrefix); //生成的文件会名去掉表前缀
//        strategy.setInclude(scanner("表名，多个英文逗号分割").split(","));
        strategy.setInclude(tableNames);
        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");

        mpg.setStrategy(strategy);
        mpg.execute();
    }



}

